#include <string>
#include <stack>

using namespace std;
// 思路： 使用栈来解码字符串
// 1. 没有遇到 ] 就入栈， 遇到 ] 就出栈 出栈的时候获取temp 和 num 直到 [ 结束出栈
class Solution
{
public:
    string decodeString(string s)
    {
        stack<string> st;
        // 1. 遍历字符串，遇到 ] 就出栈  不是就入栈
        for (auto &c : s)
        {
            if (c != ']')
            {
                string temp;
                temp = temp + c;
                st.push(temp);
            }
            else
            { // 出栈
                string temp;
                // 1. 获取栈里面 [ 之前的字符，拼接上
                while (st.top() != "[")
                {
                    temp = st.top() + temp;
                    st.pop();
                }
                st.pop(); // 删除 [
                // 2. [ 之前处理完了，然后处理字符数字
                string num;
                while (!st.empty() && isdigit(st.top()[0]))
                {
                    num = st.top() + num;
                    st.pop();
                }
                // 3. 根据字符串和字符数字 拼接字符串，然后入栈
                string str;
                int cnt = stoi(num);
                while (cnt--)
                {
                    str += temp;
                }
                st.push(str);
            }
        }
        // 2. 最后字符串处理完了，然后栈的所有处理好的字符串拼接
        string res;
        while (!st.empty())
        {
            res = st.top() + res;
            st.pop();
        }
        return res;
    }
};
